<?php

require 'lib/model/om/BaseTargetApartamentPeer.php';


class TargetApartamentPeer extends BaseTargetApartamentPeer
{
    /**
     * Returneaza ID-ul target-ului corespunzator unei liste cu apartamente
     *
     * @param string|array $apartamente
     * @param bool $save Daca lista cu apartamente nu coincide cu un target existent, se poate crea unul nou
     *
     * @return int Id-ul target-ului
     */
    static public function getTargetId(array $apartamente, $save = false)
    {
        // verific daca lista este vida
        if (!count($apartamente))
        {
            return null;
        }

        // ordonez lista cu apartamente pentru o prelucrare eficienta a datelor
        sort($apartamente);

        // extrag toate target-urile
        $criteria = new UserCriteria('TargetPeer');
        $criteria
            ->addColumns(array(
                'target_id'     => TargetPeer::ID,
                'apartament_id'  => self::APARTAMENT_ID,
            ))
            ->addJoin(TargetPeer::ID, self::TARGET_ID, Criteria::INNER_JOIN)
            ->addAscendingOrderByColumn(self::APARTAMENT_ID);

        $target = array();

        $stmt = self::doSelectStmt($criteria);
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
        {
            $target_id      = $row['target_id'];
            $apartament_id   = $row['apartament_id'];
            if (!isset($target[$target_id]))
            {
                $target[$target_id] = array();
            }

            $target[$target_id][] = $apartament_id;
        }

        // pentru fiecare target analizez lista cu apartamente
        foreach ($target as $target_id => $apartament_list)
        {
            if (myTools::array_equal($apartamente, $apartament_list))
            {
                // lista initiala cu apartamente coincide cu cea a target-ului curent:
                return $target_id;
            }
        }

        // lista initiala cu apartamente NU coincide cu cea a target-ului curent:
        if ($save)
        {
            // creez un nou target
            $targetObject = new Target();
            $targetObject->setUserId(UserCriteria::getUserId())->save();

            // adaug la target-ul creat lista cu apartamente
            foreach ($apartamente as $ap_id)
            {
                $objectClass = self::getOMClass(false);
                $targetApartamentObject = new $objectClass;
                $targetApartamentObject
                    ->setTargetId($targetObject->getId())
                    ->setApartamentId($ap_id)
                    ->save();
            }

            return $targetObject->getId();
        }

        return null;
    }


}
